<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

include_once 'ExceptionDAO.php';
include_once 'TOEmail.php';

/**
 * Operações de email
 * 
 * @author Douglas Rafael
 */
class DAOEmail extends CI_Model {
    private $config;
    
    
    /**
     * Lista todos os emails cadastrados.
     * 
     * @param int    $init      Posição inicial do cursor
     * @param int    $quant     Total de registros
     * @param string $orderby   Nome da coluna a ser ordenada
     * @param string $direction Direção: ASC ou DESC
     * @return array TOEMail    Array de objetos
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function select_all_emails($init, $quant, $orderby = NULL, $direction = NULL) {
        try {
            $orderby != NULL && $direction != NULL ? $this->db->order_by($orderby, $direction) : $this->db->order_by('id', 'ASC');
            $result = $this->db->get('email', $quant, $init);

            //Caso ocorra erro no select
            if (!$result) {
                throw new Exception('Ocorreu um erro de banco de dados ao tentar listar os e-mails.');
            } else {
                $emails = array();
                foreach ($result->result() as $value) {
                    $email = new TOEmail();
                    $email->id = $value->id;
                    $email->assunto = $value->assunto;
                    $email->destinatario = $value->destinatario;
                    $email->mensagem = $value->mensagem;
                    $email->data_cadastro = $value->data_cadastro;
                    $email->data_envio = $value->data_envio;
                    $email->status = $value->status;
                    
                    array_push($emails, $email);
                }
                return $emails;
            }
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }
    
    
    /**
     * Retorna o Total geral e-mails cadastrados.
     * 
     * @return int Total de resgistros
     */
    public function amount_all_emails() {
        return $this->db->count_all_results('email');
    }
    
    
    /**
     * Seleciona um e-mail de acordo com seu id
     * 
     * @param  TOEmail $email   Obejto contendo o id do e-mail a ser selecionado
     * @return TOEmail          Obejeto contendo o e-mail selecionado
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function get_email(TOEmail $email) {
        try {
            $this->db->where("id", $email->id);
            $result = $this->db->get('email');

            //Caso ocorra erro no select
            if (!$result) {
                throw new Exception('Ocorreu um erro de banco de dados ao tentar selecionar e-mail.');
            } else {
                $value = $result->row();

                $email = new TOEmail();
                $email->id = $value->id;
                $email->assunto = $value->assunto;
                $email->destinatario = $value->destinatario;
                $email->mensagem = $value->mensagem;
                $email->data_cadastro = $value->data_cadastro;
                $email->data_envio = $value->data_envio;
                $email->status = $value->status;

                return $email;
            }
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }
    
    
    /**
     * Insere no banco de dados e-mail
     * 
     * @param  TOEmail  $email  Dados do e-mail a ser inserido
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function insert_email(TOEmail $email) {
        try {
            $this->db->set('assunto', $email->assunto);
            $this->db->set('destinatario', $email->destinatario);
            $this->db->set('mensagem', $email->mensagem);
            $this->db->set('data_cadastro', $email->data_cadastro);
            $this->db->set('data_envio', $email->data_envio);
            $this->db->set('status', $email->status);
            $this->db->set('usuario_admin_id', $email->usuario->id);
            
            $result = $this->db->insert('email');

            if (!$result) {
                throw new Exception();
            }
        } catch (Exception $erro) {
            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($this->db->_error_number(), $this->db->_error_message(), $email->assunto));
        }
    }
    
    /**
     * Atualiza no banco dados do e-mail
     * 
     * @param  TOEmail  $email  Dados do e-mail a ser inserido
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function update_email(TOEmail $email) {
        try {
            $this->db->set('assunto', $email->assunto);
            $this->db->set('destinatario', $email->destinatario);
            $this->db->set('mensagem', $email->mensagem);
            $this->db->set('data_envio', $email->data_envio);
            $this->db->set('status', $email->status);
            $this->db->where('id', $email->id);
            $result = $this->db->update('email');

            if (!$result) {
                throw new Exception();
            }
        } catch (Exception $erro) {
            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($this->db->_error_number(), $this->db->_error_message(), $email->assunto));
        }
    }
    
    
    /**
     * Excluir e-mail de acordo com o id.
     * 
     * @param  TOEmail  $email  Obejto contendo dados
     * @throws ExceptionDAO 
     */
    public function delete_email(TOEmail $email) {
        try {
            $this->db->where_in('id', $email->id);
            $result = $this->db->delete('email');

            if (!$result) {
                throw new Exception();
            }
        } catch (Exception $erro) {
            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($this->db->_error_number(), $this->db->_error_message(), $email->assunto));
        }
    }
    
    /**
     * Efetua busca por e-mail
     * 
     * @param int    $init      Posição inicial do cursor
     * @param int    $quant     Total de registros
     * @param string $term      Term a buscar
     * @param string $orderby   Nome da coluna a ser ordenada
     * @param string $direction Direção: ASC ou DESC
     * @return array TOEMail    Array de objetos
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function search_email($init, $quant, $term = NULL, $orderby = NULL, $direction = NULL) {
        try {
            $this->db->like('id', $term);
            $this->db->or_like('assunto', $term);
            $this->db->or_like('destinatario', $term);
            $orderby != NULL && $direction != NULL ? $this->db->order_by($orderby, $direction) : $this->db->order_by('id', 'ASC');
            $result = $this->db->get('email', $quant, $init);

            //Caso ocorra erro no select
            if (!$result) {
                throw new Exception('Ocorreu um erro de banco de dados ao tentar buscar e-mail.');
            } else {
                $emails = array();
                foreach ($result->result() as $value) {
                    $email = new TOEmail();
                    $email->id = $value->id;
                    $email->assunto = $value->assunto;
                    $email->destinatario = $value->destinatario;
                    $email->mensagem = $value->mensagem;
                    $email->data_cadastro = $value->data_cadastro;
                    $email->data_envio = $value->data_envio;
                    $email->status = $value->status;
                    
                    array_push($emails, $email);
                }
                return $emails;
            }
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }
    
    
    /**
     * Retorna a quantidade de registros da busca
     * 
     * @param string $term
     * @return int
     */
    public function amount_search_email($term) {
        $this->db->like('id', $term);
        $this->db->or_like('assunto', $term);
        $this->db->or_like('destinatario', $term);

        return $this->db->count_all_results('email');
    }
    

    /**
     * Envia e-mail
     * 
     * @param  TOEmail $email   Obejeto contendo dados para envio de e-mail
     * @return boolean          Se o e-mail foi enviado com sucesso é retornado TRUE, se não é lançado uma excessão
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function send_email(TOEmail $email) {
        try {
            $this->load->model('DAOConfig');
            $this->config = $this->DAOConfig->get_config();

            $config = $this->set_config();

            $this->load->library('email', $config);
            $this->email->set_newline("\r\n");

            $this->email->from($this->config->smtp_user, $this->config->nome_instituicao);
            $this->email->to($email->destinatario);
            $this->email->subject($email->assunto);
            $this->email->message($email->mensagem);

            if (!$this->email->send()) {
                throw new Exception('Ocorreu um erro ao tentar enviar e-mail');
            } else {
                return TRUE;
            }
            // CLEAR no config
            $this->email->clear();
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }

    /**
     * Seta configurações gerais para o envio de e-mail
     * 
     * @return array    Array contendo as configurações
     */
    private function set_config() {
        $config['protocol']  = 'smtp';
        $config['mailtype']  = 'html';
        $config['charset']   = 'utf-8';
        $config['wordwrap']  = TRUE;
        $config['smtp_host'] = $this->config->smtp_host;
        $config['smtp_port'] = $this->config->smtp_port;
        $config['smtp_user'] = $this->config->smtp_user;
        $config['smtp_pass'] = $this->config->smtp_pass;
        
        return $config;
    }

}

